5. 数猫をGUIアプリにする(1)
https://gyazo.com/9da79d451dd79bc548f6317ffd64636a
BoardBaseクラスのオブジェクトに、描画されている数字をマウスで左クリックで色を変化させる機能を付け加えたクラスBoardを定義する。
code: board.py
from baseboard import BaseBoard
class Board(BaseBoard):
def __init__(self, base, CellSize = 60):
super(Board, self).__init__(base, CellSize)
self.myCanvas.bind("<Button-1>", self.touch)
for j in range(9)] for i in range(9)]
for i in range(9):
for j in range(9):
self.hide(i, j, 0)
def hide(self, i, j, n):
self.myCanvas.tag_lower(obj)
def reveal(self, i, j, n):
self.myCanvas.tag_raise(obj)
def change_color(self, i, j, n, color):
self.myCanvas.itemconfigure(obj, fill = color)
self.myCanvas.tag_raise(obj)
def get_color(self, i, j, n):
return self.myCanvas.itemcget(obj, 'fill')
def change_number(self, i, j, number):
self.myCanvas.itemconfigure(obj, text = '%s' % number)
def get_number(self, i, j):
return int(self.myCanvas.itemcget(obj, 'text'))
def touch(self, event):
size = self.CellSize // 3
x, y = event.x,event.y
i, j, n = self.xy2ijn(size, x, y)
return None
else:
self.change_status(i, j, n)
def change_status(self, i, j, n):
if self.get_number(i, j) != 0:
c = self.get_color(i, j, 0)
if c == 'red':
self.change_color(i, j, 0, 'black')
elif c == 'black':
self.change_color(i, j, 0, 'red')
else:
return
else:
c = self.get_color(i, j, n)
if c == 'red':
self.change_color(i, j, n, 'grey50')
elif c == 'grey50':
self.change_color(i, j, n, 'red')
else:
return
if __name__ == "__main__":
from tkinter import Tk
myTk = Tk()
suuneko = Board(myTk)
for i in range(9):
for j in range(9):
if n:
suuneko.change_number(i, j, n)
suuneko.change_color(i, j, 0, color = 'black')
for n in range(1, 10):
suuneko.hide(i, j, n)
myTk.mainloop()
クラス変数:
Obj各マス目に大きな数字0と、1から9の小さな数字を描画して、そのオブジェクトのidを保持する3次元リスト。Obj[i][j][0]はi行j列のセルに描画された大きな数字のid、Obj[i][i][n]はi行j列のセルに描画された小さな数字nのid、これらの数字のidを利用してオブジェクトの属性を変化させるために用いる。大きな数字の0はすべて、あらかじめ隠しておく。
メソッド:
hide数字のオブジェクトを最背面にして隠す
reveal数字のオブジェクトを最前面にして表示する
change_color数字のオブジェクトの色を変える
get_color数字のオブジェクトの現在の色を取得する
change_number大きな数字のオブジェクトの数字を変える
get_number大きな数字のオブジェクトの数字を変える
touchマウスの左クリックで選択した数字オブジェクトのステータスを変える
change_statusステータスを変える。大きな数字は 黒<->赤のトグル、小さな数字は 灰色<->赤のトグル